home *** CD-ROM | disk | FTP | other *** search
- |global:
- .globl _fs_tbase
- .globl _trap_2
- .globl __first_leave_aes
- .globl __desk_leave_aes
- .globl _trap_13
- .globl _trap_3
- .globl _use_trap_3
- .globl _spl7
- .globl _spl
- .globl __setstack
- |extern:
- .globl _la_init
- .globl _gem |xbra struct
- .globl _bios
- .globl _mytrap
- .globl _enter_aes
- .globl _leave_aes
- .globl _is_desk
- .globl _os_base
- .text
- _fs_tbase: jmp _la_init
- _trap_2: cmpw #0xc8, d0
- beqs 0f
- movl _gem+8, sp@-
- rts
- 0: andw #0xdfff,sp@ |don't return in super
- movml a0-a1, sp@- |that's right, the aes preserves everything
- |but d0
- movl _curapp, a0
- movl sp, a1
- movl a1, a0@
- movl a0@(4), a0
- movl a0, sp
- tstw 0x59e |longframe?
- bnes 0f
- movl a1@(10),sp@- |(*pc)()
- bras 1f
- 0: movl a1@(12), sp@-
- 1: movl d1, sp@-
- jsr _enter_aes
- movl sp@+, d1
- addql #4, sp
- tstw d0 |did lack manage this one on its own?
- bnes done
- movw #0xc8, d0
- pea pc@(back) |where trap #2 will return
- tstw 0x59e |longframe?
- beqs 1f
- clrw sp@-
- 1: movw sr, sp@-
- call: movl _gem+8, sp@-
- rts
- back: tas _use_trap_3 |the idea is to block anyone elses use of
- trap #3 |this trap as briefly as possible
- movml d0-d1, sp@-
- back_in_super: jsr _leave_aes
- movml sp@+, d0-d1
- done: movl _curapp, a0
- movl sp, a1
- movl a1, a0@(4)
- movl a0@, a0
- movl a0, sp
- movml sp@+, a0-a1
- rte
- __first_leave_aes:
- tas _use_trap_3
- trap #3
- tstw 0x59e
- beqs 0f
- subql #2, sp
- 0: subql #6, sp |now we can rte
- movml d0-d1/a0-a1, sp@-
- jsr _leave_aes
- tstw 0x59e
- beqs 1f
- movl d0, sp@(20)
- bra 2f
- 1: movl d0, sp@(18)
- 2: movml sp@+, d0-d1/a0-a1
- rte
- __desk_leave_aes: |still in super
- subql #4, sp |now we can rts
- movml d0-d1/a0-a1, sp@- |maybe I only need to save d0??
- jsr _leave_aes
- movl d0, sp@(16)
- movml sp@+, d0-d1/a0-a1
- rts
- _trap_13:
- btst #5, sp@
- beq not_gem
- tstw 0x59e
- beqs 0f
- movl sp@(12), d1 |call address
- movl sp@(8), d0 |func and first arg
- bras 1f
- 0: movl sp@(10), d1
- movl sp@(6), d0
- 1: cmpl #0x50101, d0
- bnes not_gem
- cmpl _os_base, d1
- bgts not_gem
- | cmpl _os_end, d1
- | blts not_gem
- movw #1, _is_desk
- movl #_gem + 12, 0x88
- movl d1, 0x404
- rte
- not_gem: movl _bios+8, sp@-
- rts
- _trap_3: bclr #7, _use_trap_3
- bnes good_call
- movl _mytrap + 8, sp@-
- rts
- good_call: tstw 0x59e
- beqs 1f
- addql #2, sp
- 1: addql #2, sp
- rts
- _spl7: movw sr,d0
- oriw #0x700, sr
- rts
- _spl: movw sp@(4), sr
- rts
- |taken directly from crt0.cpp
- __setstack: movel sp@+, a0 | save return address
- movel sp@, sp | new stack pointer
- subql #4, sp | fixup for tidy upon return
- jmp a0@ | back to caller
- .data
- .comm _use_trap_3, 2
-